iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0

今天,就讓我們來深入分析一段由 Claude 生成的 Node.js 後端程式碼,看看它究竟有哪些值得學習的「專業」細節,以及如何運用 Socket.io 打造即時通訊功能。

1. 專案架構與模組化:乾淨有序的程式碼之道

你是不是也曾經面對過一個數千行的 server.js 檔案,想找個功能卻像大海撈針?

Claude 生成的這段程式碼,一開始就為我們示範了如何建立一個乾淨、模組化的專案架構。

// Load environment variables
dotenv.config();

// Import core modules
const { connectDatabase } = require('./core/database/connection');
const errorHandler = require('./core/middleware/errorHandler');

// API Routes
const authRoutes = require('./api/routes/auth');
const patientRoutes = require('./api/routes/patients');
// ...

可以看到,它將不同的功能拆分到各自的資料夾與檔案中:

  • core/:存放核心功能,例如資料庫連線 (connection.js)。
  • middleware/:集中管理中介軟體,如全域錯誤處理 (errorHandler.js)。
  • api/routes/:將 API 路由按功能拆分,如使用者驗證 (auth.js)、病患相關 (patients.js) 等。

這種分層設計不僅讓程式碼更容易維護,當專案規模擴大時,也能讓團隊成員分工合作,避免程式碼衝突。


2. 常用中介軟體 (Middleware):防禦與效能兼顧

這段程式碼最讓我驚豔的部分,是它毫不猶豫地引入了多個 Production-Ready 的中介軟體。這顯示出它不只會「寫」程式,還懂得如何讓程式碼安全且高效地運作。

  • helmet() (安全):它就像是伺服器的「安全帽」,能自動設定各種 HTTP Headers,有效防禦 XSS點擊劫持等常見的網頁攻擊。
  • compression() (效能):啟用 Gzip 壓縮,可以將伺服器回傳的 JSON 或 HTML 檔案壓縮得更小,大幅提升網頁載入速度,使用者體驗自然更好。
  • rateLimit() (防護):這個中介軟體能限制單一 IP 在特定時間內的請求次數。這對於防止惡意爬蟲DDoS 攻擊非常有效,保護我們的伺服器資源不被濫用。

這些都是在實際開發中非常重要的細節,但往往容易被新手忽略。Claude 能一次到位地考慮進來,確實令人印象深刻。


3. Socket.io:打破傳統!實現即時雙向通訊

最後,讓我們來聊聊這段程式碼中最有趣的部分:Socket.io

傳統的網頁通訊模式是客戶端發出請求 (Request)伺服器回傳回應 (Response)。但如果今天我們需要「即時」更新,例如聊天室訊息、即時通知,甚至是文件協作,這種模式就顯得效率低落。

Socket.io 是一個基於 WebSocket 的函式庫,它能建立一個永續的雙向通訊管道。你可以想像成客戶端與伺服器之間有一條專線電話,兩邊都可以隨時撥號給對方,而不需要每次都重新撥號。

如何應用?

這段程式碼的 Socket.io 應用主要有三個核心概念:

  1. 連線 (Connection)
    io.on('connection', (socket) => { ... });
    當客戶端連上來時,會觸發 connection 事件,此時伺服器會獲得一個代表該連線的 socket 物件。每個 socket 都有一個獨一無二的 id
  2. 房間 (Rooms)
    socket.on('join-room', (room) => { socket.join(room); });
    這個功能非常實用!它能將使用者分組到不同的「房間」裡。舉例來說,一位物理治療師和他的病患可以加入同一個房間,當治療師更新進度時,伺服器只需要將訊息發送給這個房間,其他無關的使用者就不會收到通知,這實現了精準推播,避免了廣播造成的資源浪費。
  3. 發送與接收事件 (emit & on)
    socket.to(data.room).emit('progress-updated', data);emit 是「發送」事件,on 是「接收」事件。當客戶端發送 progress-update 事件時,伺服器會監聽到,然後利用 socket.to(data.room).emit(...),將 progress-updated 事件發送給該房間裡的所有使用者。

總結來說,Claude 不僅幫我們建構了一個具備安全性、效能與模組化的後端服務,更透過 Socket.io 實現了即時通訊的強大功能。這段程式碼無疑是一份極佳的學習範本,讓我們能夠從中學習到許多實戰中不可或缺的專業知識。


上一篇
Day 4: 初探 MongoDB Connection
系列文
30 天用 Vibe Coding 打造多角色復健追蹤應用5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言